﻿#ifndef PST_JSONDEF_H
#define PST_JSONDEF_H

#include <qstring.h>
#include <qvector.h>
#include <qsharedpointer.h>

#include "PostEnumType.h"
#include "TextFileParser.h"

namespace pst
{
    struct ResultFileInfo;
    using ResultFilePointer = QSharedPointer<ResultFileInfo>; // json结果文件数据共享智能指针定义
    using ResultFileWeak = QWeakPointer<ResultFileInfo>;      // json结果文件数据观察智能指针定义

    using MulitFileInfo = QPair<QPair<int, QString>, QVector<QPair<double, QString>>>; // int代表时域和频域，1：时域；2：频域，QString代表单位，vector中的double代表数值，QString代表的对应文件的路径
    // 结果文件数据信息
    struct ResultDataInfo
    {
        bool isDir;                    // 是否是路径
        QString path;                  // 路径
        QString resultDataType;        // 结果数据类型名(从json中的result_type字段进行的转换，并且添加时域与频域的判断显示)
        FileDataTypes fileType;        // 数据类型(可进行哪些绘图)
        MulitFileInfo mulitFileInfo;   // 结果数据路径列表
        ResultFileWeak resultFileInfo; // json结果文件数据观察智能指针
    };
    using ResultDataPointer = QSharedPointer<ResultDataInfo>; // 结果数据文件解析信息智能指针定义

    // json结果文件数据
    struct ResultFileInfo
    {
        int result_type;                    // 填写结果类型（体电场分布/表面电场分布/面电场分布等）对应的数值
        QString result_folder_path;         // 结果文件存储路径
        int result_data_type;               // 填写结果数据类型（标量/幅度+相位/实部+虚部）对应的数值
        QString result_data_name_td;        // 填写单个时域文件结果数据文件名，建议数据名后加_td说明该文件为时域结果
        QString result_data_name_fd;        // 填写单个频域文件结果数据文件名，建议数据名后加_fd说明该文件为频域结果
        QString result_data_folder_name_td; // 时域数据：结果数据是多个文件时，放在同一文件夹里，文件夹名即为结果数据名，文件夹内的数据文件按00000/00001/00002...的规则顺序排列
        QString result_data_folder_name_fd; // 频域数据：结果数据是多个文件时，放在同一文件夹里，文件夹名即为结果数据名，文件夹内的数据文件按00000/00001/00002...的规则顺序排列
        QString time_unit;                  // 时间单位
        QVector<double> time_data;          // 时间数组
        QString frequency_unit;             // 频率单位
        QVector<double> frequency_data;     // 频率数组
        int field_monitor_type;             // 填写场监视器类型（体/面/点/球/无）对应的数值
        QString field_monitor_unit;         // 填写场监视器对应几何尺寸单位
        struct
        {
            double sta_x;     // x轴起始坐标
            double end_x;     // x轴终止坐标
            int num_x;        // x轴采样点数
            double sta_y;     // y轴起始坐标
            double end_y;     // y轴终止坐标
            int num_y;        // y轴采样点数
            double sta_z;     // z轴起始坐标
            double end_z;     // z轴终止坐标
            int num_z;        // z轴采样点数
            double sta_theta; // Theta轴起始坐标
            double end_theta; // Theta轴终止坐标
            int num_theta;    // Theta轴采样点数
            double sta_phi;   // Phi轴起始坐标
            double end_phi;   // Phi轴终止坐标
            int num_phi;      // Phi轴采样点数
        } field_monitor_sample_info;
        struct ModelPosition
        {
            double position_X;   // 该字段记录天线装机位置的X坐标点信息
            double position_Y;   // 该字段记录天线装机位置的Y坐标点信息
            double position_Z;   // 该字段记录天线装机位置的Z坐标点信息
            double rotate_Theta; // 该字段记录天线装机时在Theta方向上的旋转角度
            double rotate_Phi;   // 该字段记录天线装机时在Phi方向上的旋转角度
        } Antenna_position;
        QVector<ResultDataPointer> result_data; // 结果文件数据信息列表
    };

    // json表头文件信息
    struct HearderFileInfo
    {
        struct
        {
            QString pre_design_name;             // 仿真工程对应预设计的名称
            int sim_scene;                       // 对应的仿真场景
            QString name;                        // 仿真工程的名称
            QVector<QString> geometry_file_name; // 模型路径
        } sim_project_info;
        QVector<ResultFilePointer> result_info; // json结果文件数据列表
    };
} // namespace pst

#endif
